-- $LastChangedDate: 2007-06-01 02:52:33 +0200 (Fri, 01 Jun 2007) $
-- $LastChangedRevision: 149 $
-- $LastChangedBy: vicente $

SEPARATE (Tareas.Gmonitores)

   -- Buscar un monitor libre en la lista MList
PROCEDURE Get_Idle_Monitor (
      Mlist             : IN     Listas.Gmonitores_Lists.List_Type;
      M                 :    OUT Monitorptr;
      Monitores_Libre   : IN OUT Natural;
      Monitores_Ocupado : IN OUT Natural;
      Cl_Id             : IN     Task_Id) IS
   Encontrado : Boolean                               := False;
   It         : Listas.Gmonitores_Lists.List_Iterator;
   Nodo       : Nodomonitor;
BEGIN
   It := Listas.Gmonitores_Lists.First(Mlist);
   WHILE It /= Listas.Gmonitores_Lists.Last(Mlist) AND NOT
         Encontrado LOOP
      Nodo := Listas.Gmonitores_Lists.Value(It);
      IF Nodo.Estado = Libre THEN
         Encontrado:= True;
      ELSE
         It := Listas.Gmonitores_Lists.Succ(It);
      END IF;
   END LOOP;

   -- si no encuentra un monitor libre devuelve NULL
   IF NOT Encontrado THEN
      M:= NULL;
      Print("get_idle_monitor: No hay monitores libres");
   END IF;

   IF Encontrado THEN
      M:= Nodo.Mptr;
      Print("get_idle_monitor: asignado al cliente " & Image(Cl_Id) & " el monitor con ID "
         & Image(Nodo.Id));

      Nodo.Estado := Ocupado;
      Listas.Gmonitores_Lists.Update(It, Nodo);
      Monitores_Libre := Monitores_Libre - 1;
      Monitores_Ocupado := Monitores_Ocupado + 1;
      -- log
      Log_Dec(Monitor_Libre);
   END IF;
END Get_Idle_Monitor;
